package com.nas.crocus.controller;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.nas.crocus.domain.Alojamiento;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.RegistroAlojamiento;
import com.nas.crocus.domain.ReservaAlojamiento;
import com.nas.crocus.service.AlojamientoService;
import com.nas.crocus.service.PasajeroService;
import com.nas.crocus.service.RegistroAlojamientoService;
import com.nas.crocus.service.ReservaAlojamientoService;
import com.nas.crocus.vo.AlojamientoVo;
import com.nas.crocus.vo.ServicioPasajeroVo;

@Controller
@RequestMapping(value = "/servicioPasajero")
public class ServicioPasajeroController {

    @Autowired
    private RegistroAlojamientoService registroAlojamientoService;

    @Autowired
    private AlojamientoService alojamientoService;

    @Autowired
    private ReservaAlojamientoService reservaAlojamientoService;

    @Autowired
    private PasajeroService pasajeroService;

    @RequestMapping(value = "evento/id/{eventoId}/pasajero/id/{pasajeroId}", method = RequestMethod.GET)
    public @ResponseBody
    ServicioPasajeroVo buscarReservas(@PathVariable Long eventoId, @PathVariable Long pasajeroId) {

        ServicioPasajeroVo servicioPasajeroVo = buscarReservaPorEventoPasajero(eventoId, pasajeroId);

        return servicioPasajeroVo;
    }

    @RequestMapping(value = "evento/id/{eventoId}/pasajero/id/{pasajeroId}/alojamiento", method = RequestMethod.POST)
    public @ResponseBody
    ServicioPasajeroVo reservarAlojamiento(@RequestBody ReservaAlojamiento reservaAlojamiento, @PathVariable Long eventoId,
            @PathVariable Long pasajeroId) {
        reservaAlojamientoService.reservar(reservaAlojamiento);
        return buscarReservaPorEventoPasajero(eventoId, pasajeroId);
    }

    private ServicioPasajeroVo buscarReservaPorEventoPasajero(Long eventoId, Long pasajeroId) {
        ServicioPasajeroVo servicioPasajeroVo = new ServicioPasajeroVo();
        servicioPasajeroVo.setAlojamientosVo(new ArrayList<AlojamientoVo>());

        //acompaniantes del pasajero
        Pasajero pasajero = pasajeroService.buscar(pasajeroId);
        servicioPasajeroVo.setPasajero(pasajero);
        servicioPasajeroVo.getPasajero().setAcompaniantes(pasajeroService.buscarAcompaniantesPorPasajeroId(pasajeroId));
        ArrayList<Pasajero> acompaniantes = new ArrayList<Pasajero>();
        for (Pasajero acompaniante : servicioPasajeroVo.getPasajero().getAcompaniantes()) {
            acompaniante.setRegistroPasajero(null);
            acompaniante.setAcompaniantes(acompaniantes);
            acompaniante.setAcompanianteDe(null);            
        }        
        servicioPasajeroVo.getPasajero().setRegistroPasajero(null);
        if (servicioPasajeroVo.getPasajero().getAcompanianteDe() != null) {
            servicioPasajeroVo.getPasajero().getAcompanianteDe().setAcompaniantes(acompaniantes);
            servicioPasajeroVo.getPasajero().getAcompanianteDe().setRegistroPasajero(null);
            servicioPasajeroVo.getPasajero().getAcompanianteDe().setAcompanianteDe(null);
        }
        
        Collection<RegistroAlojamiento> registrosAlojamiento = registroAlojamientoService.buscarPorEventoId(eventoId);

        //Alojamientos del evento y reserva
        AlojamientoVo alojamientoVo = null;
        Collection<Alojamiento> alojamientos = new ArrayList<Alojamiento>();
        for (RegistroAlojamiento registroAlojamiento : registrosAlojamiento) {
            alojamientoVo = new AlojamientoVo();

            alojamientoVo.setRegistroAlojamiento(registroAlojamiento);
            alojamientoVo.setAlojamiento(alojamientoService.obtener(registroAlojamiento.getAlojamientoId()));
            alojamientoVo.getAlojamiento().getHotel().setAlojamientos(alojamientos);
            alojamientoVo.getAlojamiento().setEvento(null);
            
            //reserva
            alojamientoVo.setReservaAlojamiento(reservaAlojamientoService.obtenerPorRegistroParticipante(registroAlojamiento.getId(), pasajeroId));
            servicioPasajeroVo.getAlojamientosVo().add(alojamientoVo);
        }

        
        return servicioPasajeroVo;
    }

}
